/**
 * 我们从二叉树的根节点 root开始进行深度优先搜索。
 *
 * 在遍历中的每个节点处，我们输出D条短划线（其中D是该节点的深度），然后输出该节点的值。（如果节点的深度为 D，则其直接子节点的深度为 D + 1。根节点的深度为 0）。
 *
 * 如果节点只有一个子节点，那么保证该子节点为左子节点。
 *
 * 给出遍历输出S，还原树并返回其根节点root。
 *https://leetcode.cn/problems/recover-a-tree-from-preorder-traversal/
 * 思路：利用'-'的数量然后迭代
 *
 */
class RecoverFromPreorderDieDai {
    public TreeNode recoverFromPreorder(String traversal) {
        Stack<TreeNode> stack=new Stack<>();
        int index=0;
        int len=traversal.length();
        while(index<len){
            int level=0;
            int val=0;
            while(traversal.charAt(index)=='-'){
                level++;
                index++;
            }
            while(index<len&&traversal.charAt(index)!='-'){
                val=val*10+(traversal.charAt(index)-'0');
                index++;
            }
            TreeNode node=new TreeNode(val);
            if(level==stack.size()){
                if(!stack.isEmpty()){
                    stack.peek().left=node;
                }
            }else{
                while(stack.size()!=level){
                    stack.pop();
                }
                stack.peek().right=node;
            }
            stack.push(node);
        }
        while(stack.size()>1){
            stack.pop();
        }
        return stack.pop();
    }
}